package com.zhangshanfeng.test;

import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/*
## .TreeMap集合

### 5.1TreeMap集合概述和特点【理解】

+ TreeMap底层是红黑树结构
+ 依赖自然排序或者比较器排序,对键进行排序
+ 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

### 5.2TreeMap集合应用案例【应用】

+ 案例需求

  + 创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),
  学生属性姓名和年龄,按照年龄进行排序并遍历
  + 要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序
 */
public class TreeMapDemo01 {
    public static void main(String[] args) {
        //使用比较器，在Student，中实现Compairable接口是自然排序
        //比较器优先级高于自然排序
        //匿名内部类方法
        /*TreeMap<Student2,String> tm = new TreeMap<>(new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                int result = o1.getAge() - o2.getAge();
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;

                return result;
            }
        });*/

        //Lambda表达式写法
        TreeMap<Student2,String> tm = new TreeMap<>((Student2 o1,Student2 o2) ->{
            int result = o1.getAge() - o2.getAge();
            result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
            return result;
        } );

        Student2 s1 = new Student2("张三", 18);
        Student2 s2 = new Student2("李四", 20);
        Student2 s3 = new Student2("王五", 18);
        Student2 s4 = new Student2("赵六", 19);
        Student2 s5 = new Student2("张三", 18);

        tm.put(s1,"天津");
        tm.put(s2,"上海");
        tm.put(s3,"陕西");
        tm.put(s4,"云南");
        tm.put(s5,"陕北");

        //遍历
        //1.获取所有的键
        Set<Student2> keySet = tm.keySet();
        for (Student2 key : keySet) {
            //根据键获得值
            String value = tm.get(key);
            System.out.println(key + "===" + value);
        }

        //2.获取所有键值对
        Set<Map.Entry<Student2, String>> entrySet = tm.entrySet();
        for (Map.Entry<Student2, String> setvalue : entrySet) {
            Student2 key = setvalue.getKey();
            String value = setvalue.getValue();
            System.out.println(key + "----" + value);

        }

        //3.// 遍历TreeMap集合,打印每个学生的信息
        tm.forEach((Student2 key,String value)->{
            System.out.println(key + "@@@@" + value);
        });


    }
}
